home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / archivers / xpk / xpk_source / xpkmaster / tags.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  8KB  |  309 lines

  1. #ifndef XPKMASTER_TAGS_C
  2. #define XPKMASTER_TAGS_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        tags.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: tags.c 1.11 (28.10.1998)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    Tag handling functions
  12.  
  13.  1.0   09.10.96 : first real version
  14.  1.1   27.12.96 : removed 1.3 specific functions
  15.  1.2   06.01.97 : added DEBUG info
  16.  1.3   01.03.97 : added new tags
  17.  1.4   07.03.97 : corrected some of the new stuff
  18.  1.5   23.03.97 : fixed enforcer hits of version 1.4
  19.  1.6   24.03.97 : fixed some errors
  20.  1.7   06.06.97 : now only 1 request, when no outfile
  21.  1.8   20.12.97 : some code cleanup
  22.  1.9   09.01.98 : added Key tags
  23.  1.10  26.03.98 : changed parseerrortags and findmethod
  24.  1.11  28.10.98 : added XPK_NeedSeek tag
  25. */
  26.  
  27. #include <proto/dos.h>
  28. #include <proto/exec.h>
  29. #include <proto/utility.h>
  30. #include <proto/xpkmaster.h>
  31. #include <proto/xpksub.h>
  32. #include <xpk/xpkprefs.h>
  33. #include "xpkmaster.h"
  34. #include "texts.h"
  35.  
  36. static LONG findmethod(struct XpkBuffer *xbuf, STRPTR name);
  37.  
  38. /* Parse input/output buffer specification tags before an operation */
  39. XPK_ALLINONE LONG parsebuftags(struct XpkBuffer *xbuf, struct TagItem *tags)
  40. {
  41.   struct TagItem *ti, *scan = tags;
  42.   ULONG data, fh;
  43.  
  44. #ifdef DEBUG
  45.   DebugTagList("parsebuftags", tags);
  46. #endif
  47.  
  48.   /* Pass 1 */
  49.  
  50.   while((ti = NextTagItem(&scan)))
  51.   {
  52.     data = ti->ti_Data;
  53.  
  54.     switch(ti->ti_Tag)
  55.     {
  56.     case XPK_Preferences:
  57.       if(!data) xbuf->xb_Flags |= XMF_NOPREFS; break;
  58.     case XPK_ChunkHook:
  59.       xbuf->xb_ChunkHook = (struct Hook *) data;
  60.       break;
  61.     case XPK_NoClobber:
  62.       if(data) xbuf->xb_Flags |= XMF_NOCLOBBER; break;
  63.     case XPK_FileName:
  64.       xbuf->xb_Prog.xp_FileName = FilePart((STRPTR) data); break;
  65.     case XPK_GetOutLen:
  66.       xbuf->xb_GetOutLen = (ULONG *) data; break;
  67.     case XPK_GetOutBufLen:
  68.       xbuf->xb_GetOutBufLen = (ULONG *) data; break;
  69.     case XPK_GetError:
  70.       xbuf->xb_ErrBuf = (STRPTR) data; *(xbuf->xb_ErrBuf) = 0; break;
  71.     case XPK_GetOutBuf:
  72.       xbuf->xb_Flags |= XMF_GETOUTBUF;
  73.       xbuf->xb_WMsg.xmm_Flags |= XIO_GETOUTBUF;
  74.       xbuf->xb_WMsg.xmm_BufOfs = 0;
  75.       xbuf->xb_PackParam.xsp_Flags |= XSF_PREVCHUNK;
  76.       xbuf->xb_WHook = &memouthook;
  77.       xbuf->xb_GetOutBuf = (STRPTR *) data;
  78.       break;
  79.     case XPK_PackMethod: /* first pass, because of XPK_PackMode */
  80.       xbuf->xb_Flags |= XMF_PACKING;
  81.       findmethod(xbuf, (STRPTR) data);
  82.       break;
  83.     case XPK_NeedSeek:
  84.       if(data) xbuf->xb_Flags |= XMF_SEEK; break;
  85.     }
  86.   }
  87.  
  88.   if(xbuf->xb_Result) /* may be an error in findmethod */
  89.     return xbuf->xb_Result;
  90.  
  91.   /* get default preferences settings */
  92.   xbuf->xb_Flags |= XMF_EXTERNALS;
  93.   if(!(xbuf->xb_Flags & XMF_NOPREFS))
  94.   {
  95.     struct XpkPrefsSemaphore *sem;
  96.  
  97.     if((sem = GetPrefsSem()))
  98.     {
  99.       if(sem->xps_MainPrefs)
  100.       {
  101.     if(sem->xps_MainPrefs->xmp_Flags & XPKM_UseXFD)
  102.       xbuf->xb_Flags |= XMF_XFD;
  103.     if(!(sem->xps_MainPrefs->xmp_Flags & XPKM_UseExternals))
  104.       xbuf->xb_Flags &= ~XMF_EXTERNALS;
  105.     if(sem->xps_MainPrefs->xmp_Flags & XPKM_AutoPassword)
  106.       xbuf->xb_Flags |= XMF_AUTOPASSWD;
  107.       }
  108.       ReleaseSemaphore((struct SignalSemaphore *) sem);
  109.     }
  110.   }
  111.  
  112.   /* Pass 2 */
  113.  
  114.   while((ti = NextTagItem(&tags)))
  115.   {
  116.     data = ti->ti_Data;
  117.  
  118.     switch(ti->ti_Tag)
  119.     {
  120.       /* Ways to specify input data */
  121.     case XPK_InName:
  122.       xbuf->xb_RMsg.xmm_FileName = FilePart((STRPTR) data);
  123.       if(!(data = Open((STRPTR) data, MODE_OLDFILE)))
  124.      return (xbuf->xb_Result = XPKERR_IOERRIN);
  125.       xbuf->xb_RMsg.xmm_Flags |= XMF_PRIVFH;
  126.       /* no break, as following is needed too */
  127.     case XPK_InFH:
  128.       xbuf->xb_RMsg.xmm_FH = data;
  129.       xbuf->xb_RHook = &fhinhook;
  130.       break;
  131.     case XPK_InBuf:
  132.       xbuf->xb_RMsg.xmm_Buf = (STRPTR) data;
  133.       xbuf->xb_RMsg.xmm_BufOfs = 0;
  134.       xbuf->xb_RHook = &meminhook;
  135.       break;
  136.     case XPK_InLen:
  137.       xbuf->xb_InLen = xbuf->xb_RMsg.xmm_Len = data; break;
  138.     case XPK_InHook:
  139.       xbuf->xb_RHook = (struct Hook *) data;
  140.       break;
  141.  
  142.       /* Ways to specify output data */
  143.     case XPK_OutName:
  144.       if(xbuf->xb_Flags & XMF_NOCLOBBER)
  145.     if((fh = Open((STRPTR) data, MODE_OLDFILE)))
  146.     {
  147.       Close(fh);
  148.       return (xbuf->xb_Result = XPKERR_FILEEXISTS);
  149.     }
  150.       xbuf->xb_WMsg.xmm_FileName = (STRPTR) data;
  151.       if(!(data = Open((STRPTR) data, MODE_NEWFILE)))
  152.       {
  153.         xbuf->xb_WMsg.xmm_FileName = 0;
  154.      return (xbuf->xb_Result = XPKERR_IOERROUT);
  155.       }
  156.       xbuf->xb_WMsg.xmm_Flags |= XMF_PRIVFH;
  157.     case XPK_OutFH:
  158.       xbuf->xb_WMsg.xmm_FH = data;
  159.       xbuf->xb_WHook = &fhouthook;
  160.       break;
  161.     case XPK_OutBuf:
  162.       xbuf->xb_WMsg.xmm_Buf = (STRPTR) data;
  163.       xbuf->xb_WMsg.xmm_BufOfs = 0;
  164.       xbuf->xb_WHook = &memouthook;
  165.       xbuf->xb_PackParam.xsp_Flags |= XSF_PREVCHUNK;
  166.       break;
  167.     case XPK_OutBufLen:
  168.       xbuf->xb_WMsg.xmm_BufLen = data;
  169.       break;
  170.     case XPK_OutHook:
  171.       xbuf->xb_WHook = (struct Hook *) data;
  172.       break;
  173.  
  174.       /* Other junk */
  175.     case XPK_Password:
  176.       xbuf->xb_Password = (STRPTR) data;
  177.       break;
  178.     case XPK_Key16:
  179.       xbuf->xb_PassKey16 = (UWORD) data;
  180.       xbuf->xb_Flags |= XMF_KEY16;
  181.       break; 
  182.     case XPK_Key32:
  183.       xbuf->xb_PassKey32 = data;
  184.       xbuf->xb_Flags |= XMF_KEY32;
  185.       break;
  186.     case XPK_PassThru:
  187.       if(data)
  188.     xbuf->xb_Flags |= XMF_PASSTHRU;
  189.       break;
  190.     case XPK_UseXfdMaster:
  191.       if(data)
  192.         xbuf->xb_Flags |= XMF_XFD;
  193.       else
  194.         xbuf->xb_Flags &= ~XMF_XFD;
  195.       break;
  196.     case XPK_UseExternals: /* currently not used */
  197.       if(data)
  198.         xbuf->xb_Flags |= XMF_EXTERNALS;
  199.       else
  200.         xbuf->xb_Flags &= ~XMF_EXTERNALS;
  201.       break;
  202.     case XPK_PassRequest:
  203.       if(data)
  204.         xbuf->xb_Flags |= XMF_AUTOPASSWD;
  205.       else
  206.         xbuf->xb_Flags &= ~XMF_AUTOPASSWD;
  207.       break;
  208.     case XPK_ChunkReport:
  209.       if(data && !xbuf->xb_ChunkHook && !(xbuf->xb_Flags & XMF_NOPREFS))
  210.         xbuf->xb_Flags |= XMF_AUTOPRHOOK;
  211.       break;
  212.     case XPK_OutMemType:
  213.       xbuf->xb_WMsg.xmm_MemType = data;
  214.       break;
  215.     case XPK_ChunkSize:
  216.       xbuf->xb_ChunkSize = ROUNDLONG(data);    /* This may get adjusted later */
  217.       break;
  218.     case XPK_PackMode:
  219.       xbuf->xb_PackingMode = data;
  220.       break;
  221.     case XPK_TaskPri:
  222.       SetTaskPri(FindTask(NULL), data);
  223.       xbuf->xb_Flags |= XMF_OWNTASKPRI;
  224.       break;
  225.     case XPK_StepDown:
  226.       xbuf->xb_PackParam.xsp_Flags |= XSF_STEPDOWN;
  227.       break;
  228.     case XPK_LossyOK:
  229.       xbuf->xb_Flags |= XMF_LOSSYOK;
  230.       break;
  231.     case XPK_NoCRC:
  232.       xbuf->xb_Flags |= XMF_NOCRC;
  233.       break;
  234.     }
  235.   }
  236.  
  237.   if(xbuf->xb_Flags & XMF_PACKING)
  238.     xbuf->xb_PackParam.xsp_Flags &= ~XSF_PREVCHUNK;
  239.  
  240.   if(xbuf->xb_Password && !*xbuf->xb_Password)
  241.     xbuf->xb_Password = 0;
  242.  
  243.   if(!xbuf->xb_Prog.xp_FileName)
  244.   {
  245.     xbuf->xb_Prog.xp_FileName = xbuf->xb_RMsg.xmm_FileName;
  246.     if(!(xbuf->xb_Flags & XMF_PACKING) && xbuf->xb_WMsg.xmm_FileName)
  247.       xbuf->xb_Prog.xp_FileName = FilePart(xbuf->xb_WMsg.xmm_FileName);
  248.   }
  249.  
  250.   if(!xbuf->xb_Prog.xp_FileName)
  251.     xbuf->xb_Prog.xp_FileName = "";
  252.  
  253.   return (xbuf->xb_Result = 0);
  254. }
  255.  
  256. XPK_ALLINONE LONG parseerrortags(struct TagItem *tags, LONG err)
  257. {
  258.   struct TagItem *ti;
  259.   while((ti = NextTagItem(&tags)))
  260.   {
  261.     if(ti->ti_Tag == XPK_GetError)
  262.       XpkFault(err, 0, (STRPTR) ti->ti_Data, XPKERRMSGSIZE);
  263.   }
  264.   return err;
  265. }
  266.  
  267. /* Parse XPK_Get... tags after an operation is finished */
  268. XPK_ALLINONE void parsegettags(struct XpkBuffer *xbuf)
  269. {
  270.   if(xbuf->xb_GetOutBuf)
  271.     *xbuf->xb_GetOutBuf = xbuf->xb_WMsg.xmm_Buf;
  272.  
  273.   if(xbuf->xb_GetOutLen)
  274.     if(xbuf->xb_Flags & XMF_PACKING)
  275.       *xbuf->xb_GetOutLen = xbuf->xb_Fib.xf_CLen;
  276.     else
  277.       *xbuf->xb_GetOutLen = xbuf->xb_Fib.xf_ULen;
  278.  
  279.   if(xbuf->xb_GetOutBufLen)
  280.     *xbuf->xb_GetOutBufLen = xbuf->xb_WMsg.xmm_BufLen;
  281.  
  282.   if(xbuf->xb_ErrBuf)
  283.     XpkFault(xbuf->xb_Result, 0, xbuf->xb_ErrBuf, XPKERRMSGSIZE);
  284. }
  285.  
  286. /* Find a compression library/method given a name */
  287. static LONG findmethod(struct XpkBuffer *xbuf, STRPTR name)
  288. {
  289.   ULONG id;
  290.  
  291.   /* Try to use the first four letters as the ID */
  292.  
  293.   if(!name || !*name)
  294.     return XPKERR_BADPARAMS;
  295.   else if((id = idfromname(name)) == USER_COOKIE)
  296.     xbuf->xb_PackingMode = 100;
  297.   else if(!opensub(xbuf, id))
  298.     return xbuf->xb_Result;
  299.   else
  300.     xbuf->xb_PackingMode = xbuf->xb_SubInfo->xi_DefMode;
  301.  
  302.   /* note: invalid add-ons aren't checked here */
  303.   if(name[4] == '.')
  304.     xbuf->xb_PackingMode = strtoul(name + 5, 0, 10);
  305.   return 0;
  306. }
  307.  
  308. #endif /* XPKMASTER_TAGS_C */
  309.